home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene 96
/
Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso
/
misc
/
coding
/
e_os208
/
resource
/
eos.doc
< prev
next >
Wrap
Text File
|
1996-07-30
|
28KB
|
847 lines
───────────────────────────────────────────────────────────────────────────────
E.O.S. Eclipse Operating System Version 2.08 Documentation
Copyright (c) Eclipse 1995-96
───────────────────────────────────────────────────────────────────────────────
__
/\_\ _______
_______ / / / / ___ /\
/ _____/\ / / / / /\_/ / /
/ /\____\/______ / / / __ / _____/ /_______
/ _____/\ /\ ___\ / /_/ /\ \ / /\____\//\ ____\
/ /\____\/ \ \ \__/ \ \ \ \ \ \ /_/ / \ \ \___/_
/______/\ \ \ \____\ \_\ \ \ \\_\/_______ \ \ ____\
\______\/ \ \_____\\/_/ \ \_\ /\ ____\ \ \ \___/_
\/_____/ \/_/ \ \ \___/_ \ \______\
\ \_____ \ \/______/
\/_____\ \
/\______\
\/______/
───────────────────────────────────────────────────────────────────────────────
Présentation des différents modules de l'E.O.S
───────────────────────────────────────────────────────────────────────────────
L'E.O.S est constitué de plusieurs fichiers.
Objet de base :
■ KERNEL.OBJ Le coeur du système.
■ DIAMOND.OBJ Le player 32 voies.
■ EOS.OBJ La version complète qui supporte Diamond.
■ EOSLITE.OBJ La version allégée si vous n'utilisez pas Diamond.
■ DEBUG.OBJ Le debugger 32 bits.
■ EOS.INC Le fichier include.
Librairies :
■ VESA.OBJ Pour accéder directement au buffer de la carte graphique
sans se préoccuper des changements de bank en VESA.
■ FLI32.OBJ Pour visualiser les fichiers FLI et FLC.
■ SNAP.OBJ Pour la capture d'écrans 256 couleurs au format IFF.
■ JOYSTICK.OBJ Pour la gestion des manettes de jeux.
Utilitaires :
■ Light Link Pour créer un seul fichier EXE compressé.
■ Crypt Pour protéger vos données.
■ Scancode Pour afficher les codes du clavier.
■ 132 Pour passer en mode 132 colonnes.
■ 90 Pour passer en mode 90 colonnes.
■ Edconfig Pour configurer le debugger
■ Diet Pour compresser vos données
───────────────────────────────────────────────────────────────────────────────
Gestion de la mémoire avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
Avec l'E.O.S, finit les problèmes de mémoire ! Vous pouvez désormais adresser
linéairement toutes la mémoire disponible et cela quelques que soit la
configuration de votre système.
■ Mode RAW sans Himem.
■ Mode XMS avec Himem.
■ Mode VCPI avec EMS (Emm386 highscan).
■ Mode VCPI sans EMS (Emm386 noems).
■ Mode DPMI avec Windows 3.1x (avec quelques restrictions *).
■ Mode DPMI avec Windows 95.
■ Mode DPMI avec OS/2 2.1 ou OS/2 Warp.
* Voir compatiblité avec Windows
Vous pouvez allouer ou restituer de la mémoire supérieur à l'aide d'une simple
interruption de l 'E.O.S.
Allocation :
mov ah,Allocate_Memory
mov edx,Taille_Allocation
Int_EOS
jc Not_Enough_Memory
mov [Logical_Address_Of_Block],edx
Restitution de la dernière allocation :
mov ah,DeAllocate_Memory
Int_EOS
Vous pouvez avec la même simplicité créer vos propre sélecteurs et profiter
pleinement de la segmentation du mode protégé.
Allocation d'un sélecteur :
mov ah,Allocate_Selector
mov esi,0a0000h ; base
mov edi,0ffffh ; taille
Int_EOS
jc No_Free Selector
mov [_0a0000h_Sel],bx
Restitution d'un sélecteur :
mov ah,DeAllocate_Selector
mov bx,[_0a0000h_Sel]
Int_EOS
jc Invalid_Selector
───────────────────────────────────────────────────────────────────────────────
Gestion de fichiers avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
Charger un fichier en mémoire n'est guère plus compliqué.
Chargement d'un fichier externe :
mov ah,Load_External_File
mov edx,offset File_name
Int_EOS
jc Error_File
mov File_Buffer,eax
Chargement d'un fichier linké avec LightLink (Linker founit avec
l'E.O.S) :
mov ah,Load_Internal_File
mov edx,offset File_name
Int_EOS
mov File_Buffer,eax
La fonction Load_Internal_File fonctionne aussi si le programme n'est pas
linké. L'E.O.S est capable de distinguer les deux cas ce qui permet de
développer et tester un programme sans avoir à linker les données.
De plus, si votre fichier est compacté avec un format de type LZ comme
Diet 1.44 l'E.O.S le décompresse automatiquement !
Il est aussi possible de faire l'opération inverse :
mov ah,Write_External_File
mov edx,O File_name
mov esi,[Buffer]
mov ecx,[Size_Buffer]
Int_EOS
jc Error_File
───────────────────────────────────────────────────────────────────────────────
Gestion des cartes sonores avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
La gestion des cartes sonores n'a pas été oubliée.
L'E.O.S est en effet capable de jouer un sample ou un module Amiga (de 2 à 32
voix) sans la moindre programmation de votre part sur les sept cartes
suivantes :
■ Sound Blaster
■ Sound Blaster Pro
■ Sound Blaster 16 Asp
■ Sound Blaster AW32
■ Gravis Ultrasound
■ Gravis Ultrasound Max
■ Gravis Ultrasound Ace
Exemple :
mov ah,Detect_Sound_Card
xor bx,bx
mov cx,1
Int_EOS
mov ah,Load_Module
mov al,4
mov ebx,22000
mov edx,offset Module_name
Int_EOS
jc error_file
mov ah,Play_Module
Int_EOS
Plusieurs fonctions sont alors disponibles :
Set Volume Pour changer le volume de la musique
Play Sample Pour jouer un sample
Get Info Pour obtenir des infos sur la musique
(synchronisation par exemple)
Set Pattern Pour changer de position dans un module
call Pause
mov ax,4c00h
int 21h
Comme vous le voyez ci-dessus, vous n'êtes pas obligé d'arrêter la musique
ou de libérer la mémoire avant de quitter votre programme. C'est l'E.O.S qui
s'en charge. A chaque fois qu'il rencontre la fonction 4c00h ou lors
d'un plantage programme, l'E.O.S restitue automatiquement
l'environnement de départ :
■ Le mode vidéo y compris les modes VESA (132x60,etc...)
■ L'heure de l'horloge.
■ Les interruptions.
■ La mémoire allouée.
■ Stoppe la musique.
Bien entendu, il est toujours possible de libérer la mémoire et d'arrêter
un module pour en charger un autre comme ci-dessous:
mov ah,Stop_Module
Int_EOS
mov ah,Clear_Module
Int_EOS
Pour les erreurs, l'E.O.S dispose d'une sortie spécialisée qui permet d'afficher
un message d'erreur :
mov ah,Exit_Error
mov edx,Offset Error_Txt
Int_EOS
Cette fonction est identique à :
mov ah,9 ; Fonction Display String
mov edx,Offset Msg
int 21h
mov ax,4c01h
int 21h
Il est également possible de restituer à tout moment le mode vidéo de départ...
mov ah,Restore_Video_Mode
Int_EOS
───────────────────────────────────────────────────────────────────────────────
Gestion d'un second ecran monochrome
───────────────────────────────────────────────────────────────────────────────
Pour faciliter le débuggage de vos programmes, l'E.O.S fournit des fonctions de
bases qui permettent de controler un deuxième écran via une carte monochome de
type Hercule.
L'E.O.S détecte automatiquement votre écran. Cependant, si celui-ci n'était pas
reconnu, vous pouvez utiliser la séquence suivante :
mov ah,Set_Mono
mov bx,On
Int_EOS
De nombreuses fonctions sont alors disponibles comme par exemple
l'affichage d'une chaine de caratère ASCII ou d'une valeur Hexadécimal.
Afficher une Chaine ASCII :
mov ah,Set_String_Mono
mov bx,Coordonee X
mov cx,Coordonee Y
mov edx,Offset Chaine_A_Afficher
Int_EOS
Afficher une Valeur Hexadecimal :
mov ah,Set_Value_Mono
mov bx,Coordonee X
mov cx,Coordonee Y
mov edx,Valeur_A_Afficher
Int_EOS
Une macro est également disponible : Send qui permet une utilisation
plus simple de la fonction Set_Value_Mono
Afficher une Valeur sur l'écran monochrome :
Send Valeur_A_Afficher,X,Y
La chaine ASCII peut se terminer soit par $ soit par le caractère NULL.
La fonction prend aussi en compte les caractères retour chariot (13 et 10).
Les valeurs en hexadécimal ne doivent pas dépasser 16 Bits.
Attention : Pour un gains de temps aucun test n'est effectué au niveau des
coordonnées de l'écran.
Note : L'ecran Monochrome est automatiquement effacé au début et a la fin d'un
programme.
───────────────────────────────────────────────────────────────────────────────
Gestion du clavier avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
Une gestion clavier trés simple à été implantée dans l'E.O.S afin de vous
faciliter la vie. Pour l'activer il faut prendre le controle de l'interruption
09 comme ci-dessous :
Activation du gestionnaire de clavier
mov ah,Use_Int_09
mov bx,On
Int_EOS
Le clavier est alors entièrement gérer par l'E.O.S qui dialogue directement
avec lui. Il n'y a plus aucun appel vers les anciens gestionnaires du
DOS. L'interruption 16h ne fonctionne donc plus.
La lecture du clavier devient alors très facile grace à la variable Key_Map.
Cette variable est en réalité un tableau de 128 octets qui correspond
au 128 scancodes renvoyés par le clavier.
Pour connaitre l'état d'une touche il suffit de savoir si sont scancode et
à 0 ou 1 (On ou Off).
Exemple, pour tester si la touche Escape est actuellement enfoncée :
cmp Key_Map[Escape],On
je Touche_Escape_Enfoncé
...
Touche_Escape_Enfoncé:
mov Key_Map[Escape],Off
Un scancode special "All" est utilisé pour savoir une touche a été enfoncée
puis relachée.
Exemple, pour tester si la touche Escape à été enfoncée :
cmp Key_Map[All],Escape
je Touche_Escape_Enfoncer
Ce qui permet d'attendre une touche quelconque :
@@Attend_Touche:
cmp Key_Map[All],Off
je @@Attend_Touche
mov Key_Map[All],Off
Il est bien entendu possible de désactiver le clavier et de revenir à l'ancien
gestionnaire.
Restauration du clavier :
mov ah,Use_Int_09
mov bx,Off
Int_EOs
Note : A la fin du programme, l'E.O.S restitue toutes les interruptions la
restauration de l'interruption 09 n'est donc pas obligatoire.
───────────────────────────────────────────────────────────────────────────────
Synchronisation avec le balayage
───────────────────────────────────────────────────────────────────────────────
L'E.O.S possède son propre système de synchronisation.
Controle du retracage de l'ecran :
mov ah,Wait_Vbl
Int_EOS
L'utilisation de l'interruption 08 ou timer permet d'augmenter les capacités
de cette fonction. Comme pour l'interruption clavier il n'y a pas d'appel vers
les anciens gestionnaires.
Activation du gestionnaire de synchronisation :
mov ah,Use_Int_08
mov bx,On
Int_EOS
En retour, Wait_Vbl renvoie alors le nombre de balayage éffectué depuis le
dernier appel. Cette fonction renvoie toujours 1 si l'interruption 08 est Off.
Grace à l'utilisation de cette interruption et à la fonction Wait_Vbl votre
programme est toujours capable de savoir combien de frame il à perdu. On
dispose ainsi d'un compteur régulier trés pratique pour le calcul des
déplacements.
Attention : Cette fonction est instable sous Windows 3.xx.
Si vous changez de mode video, vous devez vous resynchroniser avec
Synchro_Int_08 comme ci-dessous :
mov ax,13h
DosInt 10h
mov ah,Synchro_Int_08
Int_EOS
Une macro est aussi disponible : Colors qui permet de changer une couleur
temporairement pour décomposer chaque routine de votre programme.
Fonction Colors:
colors Numero_de_couleur,Valeur_Rouge,Valeur_Verte,Valeur_bleue
Exemple d'utilisation des fonctions de balayage :
@@Boucle:
colors 0,63,0,0 ; Première couleur en Rouge vif
call Procedure_1
colors 0,0,63,0 ; Deuxièmme couleur en Ver Vif
call Procedure_2
mov ah,Wait_Vbl
Int_EOS
@@Compt:
add [Valeur_Reguliere],1
dec eax ; On additionne des valeures regulières
jne @@Compt
cmp [Key_Map+All],On
jne @@Boucle
───────────────────────────────────────────────────────────────────────────────
Les variables de l'E.O.S
───────────────────────────────────────────────────────────────────────────────
L'E.O.S possède quelques variables global qui peuvent être nécessaires à
tout moment lors de l'execution d'un programme :
Code32_Sel : Selecteur de code (CS).
----------
Exemple : Détourner l'interruption 70h :
mov ah,Set_Int
mov bx,70h
mov cx,[Code32_Sel] ; Selecteur
mov edx,O New_Int_70h ; Offset de la nouvelle routine
Int_EOS
Attention ! En mode protégé il est interdit de faire :
mov cs:[Valeur],10
Cela declencherait une exception et arreterait votre programme.
Data32_Sel : Selecteur de Données (DS).
----------
Exemple d'utilisation de Data32_Sel :
Valeur dd 0
mov [Valeur],10
En fait, les selecteurs Code32_Sel et Data32_Sel sont identiques.
La différence porte sur leur accés. Code32_Sel est en lecture alors
que Data32_Sel est en lecture et écriture.
Au debut d'un programme tout les registres de segment (sauf CS) sont
initialisés avec la valeur de Data32_Sel.
Zero_Sel : Sélecteur qui a pour origine l'adresse zero de la
-------- mèmoire. Très utile pour lire par exemple les variables
du BIOS.
Lire le mode video courant :
push es
mov es,cs:[Zero_Sel]
mov al,es:[449h] ; 40h:49h en mode réel
pop es
Real_DS,Real_ES,Real_FS,Real_GS,Real_SS,Real_SP :
-----------------------------------------------
Ces variables contienent les futures valeurs des differents segments lors d'un
appel en mode réel (Voir Le mode Réel).
───────────────────────────────────────────────────────────────────────────────
Les macros de l'E.O.S
───────────────────────────────────────────────────────────────────────────────
L'E.O.S possède des macros qui permettent de simplifier la programmation.
Macro Colors:
colors Numero_de_couleur,Valeur_Rouge,Valeur_Verte,Valeur_bleue
(Voir Synchronisation avec le balayage)
Get_Param:
Get_Param Param_Buffer
...
Param_Buffer db 128 dup (0)
Renvoie dans Param_Buffer les paramètres de la ligne de commande.
Macro Send:
Send Valeur_A_Afficher,X,Y
(Voir Gestion d'un second ecran monochrome)
Macro DosInt:
DosInt Numero_d_interruption
(Voir Le mode réel)
Macro DosCall:
DosCall Addresse Mode reel
(Voir Le mode réel)
Macro Init_es_di:
Init_es_di Offset adresse 32 bits
(Voir Le mode réel)
Macro Init_ds_dx:
Init_ds_dx Offset adresse 32 bits
(Voir Le mode réel)
───────────────────────────────────────────────────────────────────────────────
Le fichier Include (EOS.INC)
───────────────────────────────────────────────────────────────────────────────
Le fichier include EOS.INC est certainement le fichier le plus important.
Il contient en effet toutes les déclarations des différentes fonctions, macros
et variables de l'E.O.S. C'est grace à lui que votre programme est en mesure
de dialoguer avec l'E.O.S. Il sert également de guide de référence.
───────────────────────────────────────────────────────────────────────────────
Le mode réel
───────────────────────────────────────────────────────────────────────────────
Le mode réel est accessible à partir de l'E.O.S à l'aide de macros.
Pour appeller une interruption (Int) du mode réel :
DosInt Numero_d_interruption
Exemple :
mov ax,13h ; Mode 320x200 256 Couleurs
DosInt 10h ; Appel de la fonction BIOS
; Set Video Mode
Pour appeller une fonction (Call) en mode réel :
DosCall Adresse Mode reel
Exemple :
XMS_Adresse dw 0,0
mov ax,4300h ; Fonction qui teste si un
DosInt 2fh ; Driver XMS est présent
cmp al,80h
je No_XMS_Driver
mov ax,4310h ; Si oui demande son point
DosInt 2fh ; d'entré
mov [XMS_Adresse],bx
mov eax,[Real_ES]
mov [XMS_Adresse+2],ax
xor ah,ah ; Fonction 0 du driver XMS
DosCall Dword Ptr [XMS_Adresse] ; Get XMS Version
Pour initialiser les variables qui seront utilisées en mode reel :
Init_es_di Adresse 32bits
Init_ds_dx Adresse 32bits
Exemple :
Vesa_Buffer db 256 dup (0)
Init_es_di Vesa_Buffer
mov ax,4f00h ; Teste le présence d'un
DosInt 10h ; Driver VESA
cmp dword ptr Vesa_Buffer,'ASEV'
jne no_vesa
───────────────────────────────────────────────────────────────────────────────
Le linker
───────────────────────────────────────────────────────────────────────────────
L'E.O.S dispose d'un utilitaire (LLINK32.EXE) qui permet de creer un seul
fichier executable à partir de plusieurs fichiers de données.
prg.exe
image.pcx ----> final.exe
musique.mod
Une fois linké, les fichiers de données sont accesibles très façilement à
l'aide de la fonction Load_internal_File.
Exemple de l'utilisation de Load_Internal_File et Load_External_File :
Fichier_Linker db 'IMAGE.PIC',0
Fichier_Externe db 'PRG.CFG',0
mov ah,Load_Internal_File ; Charge un fichier qui peut
mov edx,O Fichier_Linker ; être linker
Int_EOS ; Pas d'erreur possible
; elle sont gerées pas l'E.O.S
mov ah,Load_External_File ; Charge un fichier externe
mov edx,O Fichier_Externe
Int_EOS
jc Error_Loading ; erreur de lecture
Pour indiquer à LLINK32 la liste des fichiers à linker il suffit créer un
fichier de lien comme ci-dessous.
Contenu d'un fichier de lien (prg.eos) :
FINAL.EXE ; Nom de l'executable qui sera
; creer
PRG.EXE ; Nom de l'executable qui sera
; linker
IMAGE.PCX ; Fichier Data qui sera linker
MUSIQUE.MOD ; Fichier Data qui sera linker
:END ; Fin du fichier
Linkage :
LLINK32 prg.ros
Attention ! Les fichiers linkés doivent être compressés avec Diet.
Afin de faciliter la programmation, il est possible d'utiliser la fonction
Load_Internal_File avec des fichiers externes. Ce qui permet de linker un
programme lorsqu'il est entierement terminé (Voir Example4).
───────────────────────────────────────────────────────────────────────────────
Les Interruptions avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
L'E.O.S permet de modifier les interruptions grace au fonction Get_Int et
Set_Int.
Exemple : Détourner l'interruption 70h :
mov ah,Get_Int ; Lit L'ancien vecteur
mov bx,70h
Int_EOS
mov [Old_Selector_Int_70h],cx
mov [Old_Offset_Int_70h],edx
mov ah,Set_Int
mov bx,70h
mov cx,[Code32_Sel] ; Selecteur
mov edx,O New_Int_70h ; Offset de la nouvelle routine
Int_EOS
L'E.O.S met aussi à la disposition du programmeur toutes une serie de fonction
accessible via l'interruption 21h.
Les fonctions sont :
Display String 9h
Make Directory 39h
Remove_Directory 3ah
Change_Directory 3bh
Create_File 3ch
Open_File 3dh
Close_File 3eh
Read_File 3fh
Write_File 40h
Delete_File 41h
Seek_File 42h
File_Attributes 43h
Get_Directory 47h
Load_and_Execute 4bh
Terminate_Program 4ch
Find_First 4eh
Find_Next 4fh
Rename_File 56h
Create_Temporary_File 5ah
Create_New_File 5bh
Exemple : Afficher un message :
Msg db 'Hello Word',13,10,36
mov ah,9 ; Fonction Display String
mov edx,Offset Msg
int 21h
mov ax,4c00h
int 21h
Attention ! Pour terminer un programme il faut IMPERATIVEMENT appeler la
fonction 4ch de l'interruption 21h
La fonction Direct_Send de l'E.O.S vous permet d'écrire directement en
Ram vidéo et d'employer des couleurs :
lea edx,Message
mov ah,Direct_Send
Int_EOS
...
Message db " ",0,1,"■ Color Blue ",0,4,"Red ",13,10,0,0
───────────────────────────────────────────────────────────────────────────────
Les IRQ ou interruptions materielle avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
Toutes les IRQ sont accessible dans votre programme. Par contre L'E.O.S a
reprogammé ses interruptions pour eviter des conflits avec les exceptions du
mode protégé. Pour utiliser une IRQ l'E.O.S met a la disposition du programmeur
deux fonctions :
Get_IRQ :
Fonction qui renvoie l'adresse d'une IRQ.
Set_IRQ :
Fonction qui detourne une IRQ.
Exemple d'utilisation :
Old_IRQ0 Label Fword
Old_Offset_IRQ0 dd 0
Old_Selector_IRQ0 dw 0
mov ah,Get_IRQ
mov bl,0 ; IRQ timer
Int_EOS
mov [Old_Selector_IRQ0],cx
mov [Old_Offset_IRQ0],edx
mov ah,Set_IRQ
mov bl,0 ; IRQ timer
mov cx,cs
mov edx,Offset New_IRQ0
Int_EOS
...
New_IRQ0:
...
jmp fword ptr cs:[Old_IRQ0]
───────────────────────────────────────────────────────────────────────────────
Les Exceptions avec l'E.O.S
───────────────────────────────────────────────────────────────────────────────
Toutes les exceptions sont gerées par l'E.O.S.
Lorsque l'une d'elle se déclenche, l'E.O.S arrête votre programme et restitue
automatiquement la memoire allouée et le mode video de depart.
───────────────────────────────────────────────────────────────────────────────
Compatibilité avec Windows (tm)
───────────────────────────────────────────────────────────────────────────────
L'E.O.S est compatible avec Windows 3.x (tm) et Windows 95 (tm). Cependant
du fait du niveau de privilege que Windows laisse a votre programme (le plus
mauvais), il est conseillé de ne pas utliser les fonctions Use_Int_08 et le
player DIAMOND si vous voulez que votre programme fonctionne correctement .
Sous windows 95 seul des ralentissements se feront sentir, mais sous windows
3.x vous risquez de planter votre système.
L'E.O.S met donc a votre disposition une fonction qui detecte la presence de
windows 3.x et windows 95 et vous laisse le choix d'arreter le programme ou
non.
Detect_Windows :
Fonction renvoir si Windows est present
Exemple d'utilisation :
mov ah,Detect_Windows
Int_EOS
test al,al
je No_Windows
cmp al,3
je Find_Windows_3
cmp al,4
je Find_Windows_95
Find_Windows_96:
Un conseil : Si votre programme utilise des resources hardware ne le
faites pas marcher sous windows.
───────────────────────────────────────────────────────────────────────────────
Le debugger
───────────────────────────────────────────────────────────────────────────────
Le debugger est un fichier objet externe qu'il vous suffit d'include au moment
du linkage et d'appeler dans votre programme : CALL DEBUG (voir exemple 6).
Les fonctions du debugger sont identiques à Turbo Debug 2.01 de borland.
Un utilitaire est aussi fourni pour configurer le debugger : EDCONFIG.EXE.
Note : Pour plus d'infos taper EDCONFIG -h